package com.example.demo.sevice.imp;

import com.example.demo.controller.data.ReturnData;
import com.example.demo.controller.vo.RegisterVo;
import com.example.demo.dao.UserDao;
import com.example.demo.entity.User;
import com.example.demo.sevice.MyAsyncService;
import com.example.demo.sevice.UserService;
import com.example.demo.util.TokenUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Service;
import org.springframework.util.StringUtils;

import javax.annotation.Resource;
import java.sql.Timestamp;
import java.util.HashMap;
import java.util.List;
import java.util.NoSuchElementException;
import java.util.Random;
import java.util.concurrent.TimeUnit;

@Service
public class UserServiceImp implements UserService {
    @Autowired
    UserDao userDao;
    @Autowired
    RedisTemplate redisTemplate;
    @Resource
    MyAsyncService myAsyncService;

    @Override
    public ReturnData getUser(String token) {
        try {
            User user  =  new User();
            String username = TokenUtil.getUsernameByToken(token);
            if(username.equals("")){
                return ReturnData.error("没有这个用户");
            }

            user = userDao.findByUsername(username).get(0);

            return ReturnData.ok(user);
        } catch (NoSuchElementException e) {//如果没有这个ID的用户，就返回错误
            return ReturnData.error("没有相关用户");
        }

    }

    @Override
    public ReturnData login(String user, String pwd) {
        //调用数据库操作类，查找对应表里有没有数据匹配
        List<User> users = userDao.findByUsernameAndPassword(user, pwd);
        if (users.size() > 0) {//如果有，登陆成功，
            //存入缓存
            redisTemplate.opsForValue().set("wx"+users.get(0).getUsername(), users.get(0));
            HashMap map = new HashMap( );
            map.put("token",TokenUtil.getToken(users.get(0).getUsername()));
            users.get(0).setPassword("");
            map.put("userInfo",users.get(0));
            return ReturnData.ok(map, "登录成功");//获取token
        } else {//查找不到对应的用户数据
            return ReturnData.error("用户名或密码错误");//此时要在前端提示该内容
        }

    }

    @Override
    public ReturnData register(RegisterVo user) {
        if (user.getEmail() == null || user.getEmail().equals("")) {
            return ReturnData.error("邮箱地址不能为空");
        }
        if (user.getCode() == 0 ) {
            return ReturnData.error("验证码不能为空");
        }
        if (user.getPassword() == null || user.getPassword().equals("")) {
            return ReturnData.error("密码不能为空");
        }
        if (user.getUsername() == null || user.getUsername().equals("")) {
            return ReturnData.error("用户名不能为空");
        }
        //
        int code = 0;
        try {
            code = (int) redisTemplate.opsForValue().get(user.getEmail());//根据提交上来的邮箱地址拿缓存中的验证码
        } catch (NullPointerException e) {
            return ReturnData.error("验证码已过期");
        }
        if (code == 0) {
            return ReturnData.error("验证码已过期");
        }
        if (user.getCode() != code) {//和缓存中的验证码比较
            return ReturnData.error("验证码错误");
        }

        List<User> list = userDao.findByUsername(user.getUsername());//根据前端传过来的用户名查找数据库
        if (list.size() > 0) {//表示用户已存在
            return ReturnData.error("用户名已存在");
        }
        list = userDao.findByEmail(user.getEmail());//根据前端传过来的用户名查找数据库
        if (list.size() > 0) {//表示用户已存在
            return ReturnData.error("邮箱已被注册");
        }
        User userDb = new User();
        userDb.setUsername(user.getUsername());
        userDb.setAge(user.getAge());
        userDb.setNickname(user.getNickname());
        userDb.setSex(user.getSex());
        userDb.setAvtar(user.getAvtar());
        userDb.setPhone(user.getPhone());
        userDb.setPassword(user.getPassword());
        userDb.setEmail(user.getEmail());
        userDb.setRegister_time(new Timestamp(System.currentTimeMillis()));//设置为当前时间
        userDao.save(userDb);
        return ReturnData.ok("注册成功");

    }

    @Override
    public ReturnData getCode(String email) throws InterruptedException {
        //        1.先 生成一个随机验证码
//        2.把验证码存到缓存
//        3.把验证码发送到用户的手机或者邮箱上
//        4.监听发送成功
//        5.返回去给前端"验证码已发送...,请注意查收
        if (email == null || email.equals("") || !email.contains("@")) {
            return ReturnData.error("邮箱错误");
        }

        List<User>  list = userDao.findByEmail(email);//根据前端传过来的用户名查找数据库
        if (list.size() > 0) {//表示用户已存在
            return ReturnData.error("邮箱已被注册");
        }

        int code = new Random().nextInt(8999) + 1000;//4位数随机数 0到8999  1
        System.out.println(code);
        redisTemplate.opsForValue().set(email, code, 3, TimeUnit.MINUTES);//把code存入缓存,有效期3分，超过3分钟就会被清理

        myAsyncService.sendSms(email, "【博客系统】", "以下是您注册博客系统的验证码为：" + code +
                ",请勿泄露给他人，避免您的个人信息泄露。");//模拟发送邮件

        return ReturnData.ok("验证码已发送...,请注意查收");
    }

    /**
     * 编辑用户信息
     * @param user
     * @param token
     * @return
     */
    @Override
    public ReturnData updateUserInfo(RegisterVo user, String token) {
        User userDb  =  new User();
        String username = TokenUtil.getUsernameByToken(token);
        if(username.equals("")){
            return ReturnData.error("没有这个用户");
        }
        try{
            userDb = userDao.findByUsername(username).get(0);
        }catch (Exception e){
            return ReturnData.error("没有这个用户");
        }
        if(!StringUtils.isEmpty(user.getNickname())){//如果前段传过来的昵称不为空
            userDb.setNickname(user.getNickname());
        }
        if(!StringUtils.isEmpty(user.getAvtar())){//如果前段传过来的头像不为空
            userDb.setAvtar(user.getAvtar());
        }
        if(!StringUtils.isEmpty(user.getPhone())){//如果前段传过来的手机不为空
            userDb.setPhone(user.getPhone());
        }
        if(user.getSex()!=0){//如果前段传过来的性别不为空
            userDb.setSex(user.getSex());
        }
        if(user.getAge()!=0){//如果前段传过来的年龄不为空
            userDb.setAge(user.getAge());
        }
        userDao.save(userDb);
        return ReturnData.ok("修改用户信息成功");
    }
}
